package cn.gok.day8;

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;

/*
关于在迭代器迭代的过程中，线程是不能对集合本身进行操作（修改，删除，增加）的
否则会抛ConcurrentModificationException的异常。
 */
public class TestMain {
    public static void main(String[] args) {
//        List list= Arrays.asList(1,2,3);//会报错
//        List<Integer> list=new ArrayList<>();//Exception in thread "main" java.util.ConcurrentModificationException
        List list=new CopyOnWriteArrayList();//解决方案。用普通for循环或者CopyOnWriteArrayList进行声明
        list.add(1);
        list.add(2);
        list.add(3);

        Iterator it= list.iterator();
        ListIterator it2=list.listIterator();
        while (it.hasNext()){
            Object o=it.next();
            if(o.equals(3)){
                list.add(4);
            }
        }
        //用ArrayList自带的迭代器：ListIterator也可以解决
        while (it2.hasNext()){
            Object o=it2.next();
            if (o.equals(3)) {
                list.add(5);
            }
        }
        System.out.println(list);
    /*
    Bug原因：
    集合操作中有两个比较重要的指标：modCount和exceptedModCount
    modCount值是用来记录当前集合被修改的次数，每修改一次就进行加1（可以认为为集合的版本号）
    而exceptedModCount是在iterator初始化是就已经指定的值，值为exceptedModCount = modCount
    总的来说，在利用迭代器或者增强for循环时，会对要操作的集合进行一个修改次数和size的保存，许多操作都会对这些值进行判断，以判断是否
    到达集合末尾需要结束。如果进行修改，那么那个modCount和exceptedModCount就会不同。就会报出错误。
     */

    }
}
